#ifndef HANDLEHELPER_H
#define HANDLEHELPER_H


#include "src/pubimp.h"
#include "src/device/Communication/Serial/SerialHelper.h"
#include "src/device/Communication/USBController/USBHelper.h"
#include "base/config.h"
#include "protocol.h"
#include "../Robot/robothelper.h"
#include <chrono>

#define NOROBOT 1
#define ZXX_DEBUG

/// 定义通讯的类型
typedef enum Tag_COM_TYPE
{
    T_RS_232 = 0,
    T_USB   ,
    T_RS_422
}T_COM_TYPE;


class HandleHelper
{
public:
    ~HandleHelper();
    /// 单例模式
    static HandleHelper* GetInstance(){
        static QMutex mutex;
        static QScopedPointer<HandleHelper> inst;
        if (Q_UNLIKELY(!inst)) {
            mutex.lock();
            if (!inst) {
                inst.reset(new HandleHelper);
            }
            mutex.unlock();
        }
        return inst.data();
    }


    void TryMessage(){
        string buff;

        buff.resize(21);
        buff[0]=(UC)(0xff);
        for(int i=1;i<20;i++){
            buff[i]=(UC)(0x44);;
        }
        buff[20]=(UC)(0x0c);

        SerialHelper::GetInstance()->p()->_sigUpdate(buff);
    }


    void sendToDevice(QByteArray);

    /// 处理数据
    void handlMessage(std::string data);

    ///
    void StopService();

    /// 单次启动
    bool ConnectHandler();

    /// 等待启动完成
    void ConnectHandlerExec();


    /// 设置串口波特率
    void SetSerialFreq(int freq);

    /// 设置中心轴坐标
    void SetMidAxis();


    /// send data to chart
    boost::signals2::signal<void(double*)> _send2Chart;

    boost::signals2::signal<void(RobotPos)> _sendCurrentPos;

    boost::signals2::signal<void(ST_HD_T*)> _send2Form;
public:
    /// 定义当前连接方式
    T_COM_TYPE comType;


private:
    HandleHelper();

    void ConnectDevice();
    void CreatService();


    QScopedPointer<std::thread> _workService;
    bool allow_handler;   /// 允许监听键盘消息
    bool allow_send;    /// 允许发送消息

    /// 本版本的按键索引
    ST_B_INX   _verIndex;
    /// 定义本次手柄数据
    ST_HD_T     _cur_Recv;
    /// 线程同步锁
    std::recursive_mutex _mtx ;

    /// pos点队列，用于平滑的移动
    std::deque<RobotPos> _posQueue;

    Millsecond recvTime;

    /// 更新机器人Pos线程
    std::thread updatePosThread;

    /* 需要隐藏的方法 */
private:
    bool CRCCheck(std::string data);
    void initCommunication();
    void InstallMessage(); /// 安装通知事件，以接收来自串口的数据
    /// 解码原始数据
    void DecodeData(std::string data);
    int  OpenLED(UC ctr);
    void InstallHeartDance();

};

#endif // HANDLEHELPER_H
